home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Best of Shareware
/
Best of PC Windows Shareware 1.0 - Wayzata Technology (7111) (1993).iso
/
mac
/
ZIPPED
/
DOS
/
TELECOMM
/
PCCP047.ZIP
/
TERMPLAY.C
< prev
next >
Wrap
Text File
|
1992-08-18
|
14KB
|
688 lines
/* Copyright (C) 1992 Peter Edward Cann, all rights reserved.
*/
#include<stdio.h>
#include<bios.h>
#include<dos.h>
#include<fcntl.h>
#include<graph.h>
#include"emu.h"
#include"color.h"
#define LISTSIZ 16
struct
{
short index;
short row;
char rowset;
short column;
char colset;
short list[LISTSIZ];
short listindex;
}
funcstor[NFUNCS];
clrfuncstor(seqn)
short seqn;
{
int i;
if(funcstor[seqn].listindex==LISTSIZ)
funcstor[seqn].listindex--;
for(i=funcstor[seqn].listindex;i>=0;i--)
funcstor[seqn].list[i]=0;
funcstor[seqn].row=funcstor[seqn].column=funcstor[seqn].listindex=funcstor[seqn].index=funcstor[seqn].rowset=funcstor[seqn].colset=0;
}
int bold, faint, blink, inverse, bkcolor, fgcolor;
struct videoconfig far *vconf;
atthndl()
{
int adds, workingbk, workingfg;
adds=0;
if((vconf->adapter!=_MDPA)&&(vconf->adapter!=_HGC))
{
workingbk=bkcolor;
workingfg=fgcolor;
if(faint)
if(inverse)
if(bkcolor==WHITE)
workingbk=GRAY;
else if(bkcolor==BLACK)
;
else
adds+=FAINTADD;
else
if(fgcolor==WHITE)
workingfg=GRAY;
else if(fgcolor==BLACK)
;
else
adds+=FAINTADD;
else
if(bold)
{
if(bkcolor==WHITE)
workingbk=BWHITE;
if(fgcolor==WHITE)
workingfg=BWHITE;
}
if(blink)
adds+=BLINKADD;
if(inverse)
{
_settextcolor(workingbk+adds);
_setbkcolor((long)(workingfg&0x07));
}
else
{
_settextcolor(workingfg+adds);
_setbkcolor((long)(workingbk&0x07));
}
}
else
{
workingbk=BLACK;
if(bold&&!inverse)
workingfg=M_UNDER;
else
if(inverse)
workingfg=WHITE;
else
workingfg=M_NORMAL;
if(faint)
if(inverse)
if(bkcolor!=BLACK)
adds+=FAINTADD;
else;
else
if(fgcolor!=BLACK)
adds+=FAINTADD;
if(blink)
adds+=BLINKADD;
if(inverse)
{
_settextcolor(workingbk+adds);
_setbkcolor((long)(workingfg&0x07));
}
else
{
_settextcolor(workingfg+adds);
_setbkcolor((long)(workingbk&0x07));
}
}
}
ansiatthndl(seqn)
short seqn;
{
int i, adds, workingbk, workingfg;
if(emu.funcs[seqn].func==ANSIATTRIB)
for(i=0;i<funcstor[seqn].listindex;i++)
switch(funcstor[seqn].list[i])
{
/*at the moment this is strictly ANSI subset*/
case 0:
bkcolor=BLACK;
fgcolor=WHITE;
bold=faint=blink=inverse=0;
break;
case 1:
bold=1;
break;
case 2:
faint=1;
break;
case 5:
case 6:
blink=1;
break;
case 7:
inverse=1;
break;
case 31:
case 41:
fgcolor=RED;
break;
case 32:
case 42:
fgcolor=GREEN;
break;
case 33:
case 43:
fgcolor=YELLOW;
break;
case 34:
case 44:
fgcolor=BLUE;
break;
case 35:
case 45:
fgcolor=MAGENTA;
break;
case 36:
case 46:
fgcolor=CYAN;
break;
case 37:
case 47:
fgcolor=WHITE;
break;
default:
break;
}
atthndl();
}
int wrap_p;
wrapctl()
{
if(wrap_p)
_wrapon(_GWRAPON);
else
_wrapon(_GWRAPOFF);
}
char fpname[256];
updstatus(c)
{
struct rccoord posptr;
short tc;
long bc;
char str[80];
posptr=_gettextposition();
tc=_gettextcolor();
bc=_getbkcolor();
_settextwindow(1,1,1,80);
_settextposition(1,1);
_settextcolor(BLACK);
_setbkcolor((long)WHITE);
_wrapon(_GWRAPOFF);
sprintf(str, "Next=%02x Bold=%d Faint=%d Blink=%d Inverse=%d", c, bold, faint, blink, inverse);
_outtext(str);
_settextwindow(2,1,25,80);
wrapctl();
_settextcolor(tc);
_setbkcolor(bc);
_settextposition(posptr.row, posptr.col);
}
int graphics;
showchar(c)
unsigned char c;
{
unsigned char str[2];
if(graphics)
if(emu.gchars[c])
c=emu.gchars[c];
str[0]=c;
str[1]='\0';
_outtext(str);
}
int savedrow, savedcol;
perffunc(seqn)
short seqn;
{
struct rccoord posptr;
int i;
switch(emu.funcs[seqn].func)
{
case CLEAR:
_clearscreen(_GCLEARSCREEN);
updstatus();
_settextposition(1,1);
break;
case HOME:
_settextposition(1,1);
break;
case CLREOL:
posptr=_gettextposition();
_wrapon(_GWRAPOFF);
for(i=posptr.col;i<=80;i++)
_outtext(" ");
_settextposition(posptr.row, posptr.col);
wrapctl();
break;
case UP:
posptr=_gettextposition();
if(posptr.row>1)
_settextposition(posptr.row-1, posptr.col);
break;
case DOWN:
posptr=_gettextposition();
if(posptr.row<24)
_settextposition(posptr.row+1, posptr.col);
else
{
showchar('\n');
_settextposition(posptr.row, posptr.col);
}
break;
case LEFT:
posptr=_gettextposition();
if(posptr.col>1)
_settextposition(posptr.row, posptr.col-1);
break;
case RIGHT:
posptr=_gettextposition();
if(posptr.col<80)
_settextposition(posptr.row, posptr.col+1);
break;
case GOTO:
funcstor[seqn].row-=(emu.firstrowaddr-1);
funcstor[seqn].column-=(emu.firstcoladdr-1);
if(funcstor[seqn].row<1)
funcstor[seqn].row=1;
if(funcstor[seqn].row>24)
funcstor[seqn].row=24;
if(funcstor[seqn].column<1)
funcstor[seqn].column=1;
if(funcstor[seqn].column>80)
funcstor[seqn].row=80;
_settextposition((emu.tophi_p?25-funcstor[seqn].row:funcstor[seqn].row), funcstor[seqn].column);
break;
case NORMAL:
fgcolor=WHITE;
bkcolor=BLACK;
blink=faint=bold=inverse=0;
atthndl();
break;
case BLINK:
blink=1;
atthndl();
break;
case NOBLINK:
blink=0;
atthndl();
break;
case BOLD:
bold=1;
atthndl();
break;
case NOBOLD:
bold=0;
atthndl();
break;
case FAINT:
faint=1;
atthndl();
break;
case NOFAINT:
faint=0;
atthndl();
break;
case INVERSE:
inverse=1;
atthndl();
break;
case NOINVERSE:
inverse=0;
atthndl();
break;
case UPN:
posptr=_gettextposition();
if(posptr.row-funcstor[seqn].row<1)
_settextposition(1, posptr.col);
else
_settextposition(posptr.row-funcstor[seqn].row, posptr.col);
break;
case DOWNN:
posptr=_gettextposition();
if(posptr.row+funcstor[seqn].row>24)
{
_settextposition(24,1);
for(i=25-(posptr.row+funcstor[seqn].row);i<0;++i)
showchar('\n');
_settextposition(24, posptr.col);
}
else
_settextposition(posptr.row+funcstor[seqn].row, posptr.col);
break;
case LEFTN:
posptr=_gettextposition();
if(posptr.col-funcstor[seqn].column<1)
_settextposition(posptr.row, 1);
else
_settextposition(posptr.row, posptr.col-funcstor[seqn].column);
break;
case RIGHTN:
posptr=_gettextposition();
if(posptr.col+funcstor[seqn].column>80)
_settextposition(posptr.row, 80);
else
_settextposition(posptr.row, posptr.col+funcstor[seqn].column);
break;
case ANSIATTRIB:
ansiatthndl(seqn);
break;
case WRAP:
wrap_p=1;
wrapctl();
break;
case NOWRAP:
wrap_p=0;
wrapctl();
break;
case GOTOLINE:
funcstor[seqn].row-=(emu.firstrowaddr-1);
posptr=_gettextposition();
if(funcstor[seqn].row<1)
funcstor[seqn].row=1;
if(funcstor[seqn].row>24)
funcstor[seqn].row=24;
_settextposition(emu.tophi_p?25-funcstor[seqn].row:funcstor[seqn].row, 1);
break;
case GOTOCOL:
funcstor[seqn].column-=(emu.firstcoladdr-1);
posptr=_gettextposition();
if(funcstor[seqn].column<1)
funcstor[seqn].column=1;
if(funcstor[seqn].column>80)
funcstor[seqn].row=80;
_settextposition(posptr.row, funcstor[seqn].column);
break;
case BINATTR:
if((funcstor[seqn].row-emu.attroffset)&emu.blinkmask)
blink=1;
else
blink=0;
if((funcstor[seqn].row-emu.attroffset)&emu.inversemask)
inverse=1;
else
inverse=0;
if((funcstor[seqn].row-emu.attroffset)&emu.boldmask)
bold=1;
else
bold=0;
if((funcstor[seqn].row-emu.attroffset)&emu.faintmask)
faint=1;
else
faint=0;
atthndl();
break;
case GRAPHCHAR:
showchar(emu.gchars[funcstor[seqn].row]);
break;
case BEGGRAPH:
graphics=1;
break;
case ENDGRAPH:
graphics=0;
break;
case TAB:
posptr=_gettextposition();
_settextposition(posptr.row, posptr.col+(8-((posptr.col-1)%8)));
break;
case BELL:
putch(7);
break;
case DTAB:
posptr=_gettextposition();
for(i=0;i<(8-((posptr.col-1)%8));++i)
_outtext(" ");
case CRLF:
showchar('\n');
break;
case SAVEPOS:
posptr=_gettextposition();
savedrow=posptr.row;
savedcol=posptr.col;
break;
case RESTOREPOS:
_settextposition(savedrow, savedcol);
break;
default:
break;
}
}
dispport(c)
unsigned char c;
{
int seqn, done, ok;
done=0;
ok=0;
for(seqn=0;seqn<NFUNCS;seqn++)
{
if(emu.funcs[seqn].codes[funcstor[seqn].index]&0xff00)
switch(emu.funcs[seqn].codes[funcstor[seqn].index])
{
case END:
if(funcstor[seqn].index)
{
done=1;
perffunc(seqn);
}
break;
case BINCOL:
funcstor[seqn].column=c-emu.bincoloff;
ok=1;
if(emu.funcs[seqn].codes[++funcstor[seqn].index]==END)
{
done=1;
perffunc(seqn);
}
break;
case BINROW:
funcstor[seqn].row=c-emu.binrowoff;
ok=1;
if(emu.funcs[seqn].codes[++funcstor[seqn].index]==END)
{
done=1;
perffunc(seqn);
}
break;
case ASCDECCOL:
if((c>='0')&&(c<='9'))
{
ok=1;
funcstor[seqn].column*=10;
funcstor[seqn].column+=(c-'0');
funcstor[seqn].colset=1;
}
else
if(funcstor[seqn].colset&&(c==emu.funcs[seqn].codes[++funcstor[seqn].index]))
{
ok=1;
if(emu.funcs[seqn].codes[++funcstor[seqn].index]==END)
{
done=1;
perffunc(seqn);
}
}
else
clrfuncstor(seqn);
break;
case ASCDECROW:
if((c>='0')&&(c<='9'))
{
ok=1;
funcstor[seqn].row*=10;
funcstor[seqn].row+=(c-'0');
funcstor[seqn].rowset=1;
}
else
if(funcstor[seqn].rowset&&(c==emu.funcs[seqn].codes[++funcstor[seqn].index]))
{
ok=1;
if(emu.funcs[seqn].codes[++funcstor[seqn].index]==END)
{
done=1;
perffunc(seqn);
}
}
else
clrfuncstor(seqn);
break;
case ASCDECSEMILIST:
if((c>='0')&&(c<='9')&&(funcstor[seqn].listindex<LISTSIZ))
{
ok=1;
funcstor[seqn].list[funcstor[seqn].listindex]*=10;
funcstor[seqn].list[funcstor[seqn].listindex]+=(c-'0');
}
else
{
if(funcstor[seqn].listindex<LISTSIZ)
funcstor[seqn].listindex++;
if(c==';')
ok=1;
else
if(c==emu.funcs[seqn].codes[++funcstor[seqn].index])
{
ok=1;
if(emu.funcs[seqn].codes[++funcstor[seqn].index]==END)
{
done=1;
perffunc(seqn);
}
}
else
clrfuncstor(seqn);
}
break;
case GRABCHAR:
ok=1;
funcstor[seqn].row=c;
if(emu.funcs[seqn].codes[++funcstor[seqn].index]==END)
{
done=1;
perffunc(seqn);
}
break;
case GRAPHCHAR_T:
if(emu.gchars[c])
{
ok=1;
funcstor[seqn].row=c;
if(emu.funcs[seqn].codes[funcstor[seqn].index]==END)
{
done=1;
perffunc(seqn);
}
}
else
clrfuncstor(seqn);
break;
}
else
if(c==emu.funcs[seqn].codes[funcstor[seqn].index])
{
ok=1;
if(emu.funcs[seqn].codes[++funcstor[seqn].index]==END)
{
done=1;
perffunc(seqn);
}
}
else
clrfuncstor(seqn);
if(done)
{
ok=1;
for(seqn=0;seqn<NFUNCS;seqn++)
clrfuncstor(seqn);
break;
}
}
if(!ok)
showchar(c);
}
initdisp()
{
int i;
for(i=0;i<NFUNCS;i++)
{
funcstor[i].listindex=LISTSIZ;
clrfuncstor(i);
}
bold=faint=blink=inverse=0;
fgcolor=WHITE;
bkcolor=BLACK;
graphics=0;
wrap_p=emu.default_wrap_p;
}
main(argc, argv)
int argc;
char **argv;
{
FILE *playfd;
char c;
struct rccoord posptr;
int follow, emufd, i;
_getvideoconfig(vconf);
_setvideomode(_DEFAULTMODE);
if(argc!=3)
{
printf("Copyright (C) 1992 Peter Edward Cann, all rights reserved.\n");
printf("USAGE: termplay <emu or - > <script>\n");
printf("<emu> is an emulation file base pathname.\n");
printf("<script> is a file of codes to play.\n");
printf("The environment variable PCCPPATH is used for the emulation file if set.\n");
exit(1);
}
fpname[0]='\0';
if(argv[1][0]!='-')
{
if((getenv("PCCPPATH")==NULL)||(argv[1][0]=='\\')||(argv[1][1]==':'))
sprintf(fpname, "%s.emu", argv[1]);
else
sprintf(fpname, "%s\\%s.emu", getenv("PCCPPATH"), argv[1]);
if((emufd=open(fpname, O_RDONLY|O_BINARY))==-1)
{
printf("Error opening emulation file %s.\n", fpname);
exit(2);
}
else
if(read(emufd, &emu, sizeof(emu))!=sizeof(emu))
{
printf("Error reading emulation file %s.\n", fpname);
exit(3);
}
else;
}
else
{
nullemu();
emu.funcs[0].func=LEFT;
emu.funcs[0].codes[0]='\b';
emu.funcs[0].codes[1]=END;
emu.funcs[1].func=DTAB;
emu.funcs[1].codes[0]='\t';
emu.funcs[1].codes[1]=END;
emu.funcs[2].func=BELL;
emu.funcs[2].codes[0]='\007';
emu.funcs[2].codes[1]=END;
}
if((playfd=fopen(argv[2], "r"))==NULL)
{
printf("Couldn't open script file %s.\n");
exit(10);
}
setmode(fileno(playfd), O_BINARY);
_clearscreen(_GCLEARSCREEN);
initdisp();
atthndl();
_settextposition(1,1);
if(vconf->adapter==_VGA)
_remappalette(GRAY, (long)0x00202020); /* Lighten up gray */
while(1)
{
c=getc(playfd);
updstatus(c);
getch();
dispport(c);
}
}